package com.mahiru.mahiruaiagent.agent;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;

/**
 * ReAct( Reasoning and Acting) 代理类
 * 实现了基于推理和行动的循环智能体模型
 *
 * @Author Enkidu
 * @Date 2025/7/9 16:33
 */
@Data
@Slf4j
@EqualsAndHashCode(callSuper = false)
public abstract class ReActAgent extends BaseAgent {

    /**
     * 处理当前状态并决定下一步行动
     *
     * @return true为执行行动 false不需要执行行动
     */
    public abstract boolean think();

    /**
     * 执行决定的行动
     *
     * @return 执行的行动结果
     */
    public abstract String act();

    /**
     * 执行单次步骤
     *
     * @return 步骤执行结果
     */
    @Override
    public String step() {
        try {
            // 先思考 再决定是否执行
            boolean shouldAct = think();
            if (!shouldAct) {
                return "思考完成，无需行动";
            }
            return act();
        } catch (Exception e) {
            // 记录异常日志
            log.error("执行步骤失败", e);
            // throw new BusinessException(ErrorCode.SYSTEM_ERROR, "执行步骤失败: " + e.getMessage());
            return "执行步骤失败: " + e.getMessage();
        }

    }
}
